#ifndef __CLX_CONFIG_HPP__
#define __CLX_CONFIG_HPP__

#define CONFIG_FILE "./cloud.config"

#include "util.hpp"
#include <mutex>

namespace clx_cloud{
    class Config{

        private:
            Config(){ ReadConfigFile(); };
            bool ReadConfigFile() {
                FileUtil fu(CONFIG_FILE);
                std::string body;
                if (!fu.GetContent(&body)) {
                    std::cout << "load config file failed" << std::endl;
                    return false;
                }

                Json::Value root;
                if (!JsonUtil::UnSerialize(body, &root)) {
                    std::cout << "parse config file failed" << std::endl;
                    return false;
                }
                _hot_time = root["hot_time"].asInt();
                _server_port = root["server_port"].asInt();
                _server_ip = root["server_ip"].asString();
                _download_prefix = root["download_prefix"].asString();
                _packfile_suffix = root["packfile_suffix"].asString();
                _pack_dir = root["pack_dir"].asString();
                _back_dir = root["back_dir"].asString();
                _backup_file = root["backup_file"].asString();
                return true;
            }
        private: 
            int _hot_time;
            int _server_port;
            std::string _server_ip;
            std::string _download_prefix;
            std::string _packfile_suffix;
            std::string _pack_dir;
            std::string _back_dir;
            std::string _backup_file;

            static std::mutex _mutex;
            static Config *_instance;
        public:
            static Config* GetInstance() {
                if (_instance == nullptr) {
                    std::unique_lock<std::mutex> ul(_mutex);
                    if (_instance == nullptr) {
                        _instance = new Config();
                    }
                }
                return _instance;
            }
            int GetHotTime()                { return _hot_time; }
            int GetServerPort()             { return _server_port; }
            std::string GetServerIp()       { return _server_ip; }
            std::string GetDownloadPrefix() { return _download_prefix; }
            std::string GetPackFileSuffix() { return _packfile_suffix; }
            std::string GetPackDir()        { return _pack_dir; }
            std::string GetBackDir()        { return _back_dir; }
            std::string GetBackupFile()     { return _backup_file; }
    };
    std::mutex Config::_mutex;
    Config* Config::_instance = nullptr;
}

#endif
